#include "RawTexture.h"

namespace k2graphics
{

RawTexture::RawTexture()
{
	_rawGLTexture = -1;
}

RawTexture::RawTexture(GLuint rawTex)
{
	_rawGLTexture = rawTex;
}

GLuint RawTexture::getRawGLTexture(int* params, int numParams)
{
	return _rawGLTexture;
}

GLuint RawTexture::getRawGLTexture()
{
	return _rawGLTexture;
}

void RawTexture::getRawTextureCoordinates(float sx, float sy, float &dx, float &dy)
{
	dx = sx;
	dy = sy;
}

void RawTexture::getRawTextureCoordinates(int* params, int numParams, float sx, float sy, float &dx, float &dy)
{
	dx = sx;
	dy = sy;
}

void RawTexture::glTextureFromSDLSurface(SDL_Surface* surface)
{
	GLenum texture_format;
	GLint  nOfColors;
	 
	// Check that the image's width is a power of 2
	if ( (surface->w & (surface->w - 1)) != 0 ) {
		printf("warning: image.bmp's width is not a power of 2\n");
	}
	
	// Also check if the height is a power of 2
	if ( (surface->h & (surface->h - 1)) != 0 ) {
		printf("warning: image.bmp's height is not a power of 2\n");
	}
 
	// get the number of channels in the SDL surface
	nOfColors = surface->format->BytesPerPixel;
	if (nOfColors == 4)     // contains an alpha channel
	{
			if (surface->format->Rmask == 0x000000ff)
					texture_format = GL_RGBA;
			else
					texture_format = GL_BGRA;
	} 
	else if (nOfColors == 3)     // no alpha channel
	{
			if (surface->format->Rmask == 0x000000ff)
					texture_format = GL_RGB;
			else
					texture_format = GL_BGR;
	} 
	else 
	{
			printf("warning: the image is not truecolor..  this will probably break\n");
			// this error should not go unhandled
			// (but it will!)
	}
 
	// Bind the texture object
	glBindTexture( GL_TEXTURE_2D, _rawGLTexture);
 
	// Set the texture's stretching properties
	glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
	glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
 
	// Edit the texture object's image data using the information SDL_Surface gives us
	glTexImage2D( GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0,
					  texture_format, GL_UNSIGNED_BYTE, surface->pixels );
}

int RawTexture::getTextureType()
{
	return RAW_TEXTURE;
}

}